package com.ruoyi.web.controller.pay;
import com.alipay.api.AlipayApiException;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.pay.domain.dto.OrderQueryDTO;
import com.ruoyi.system.pay.domain.po.PayOrder;
import com.ruoyi.system.pay.domain.dto.PayRequestDTO;
import com.ruoyi.system.pay.domain.vo.PayOrderVO;
import com.ruoyi.system.pay.service.IPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

/**
 * 支付控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/pay")
public class PayController {

    @Autowired
    private IPayService payService;

    /**
     * 创建支付宝支付订单
     *
     * @param order 支付订单信息
     * @return 支付页面 HTML 字符串
     */
    /* @PreAuthorize("@ss.hasPermi('pay:order:query')")*/
    @PostMapping("/alipay")
    public AjaxResult createAlipayOrder(@Valid @RequestBody PayOrder order) {
        try {
            String payForm = payService.createPayOrder(order);
            return AjaxResult.success(payForm);
        } catch (Exception e) {
            return AjaxResult.error("支付失败: " + e.getMessage());
        }
    }

    /**
     * 支付宝异步回调
     *
     * @param request
     * @return 支付结果
     */
    @PostMapping("/alipay/notify")
    public String handleAlipayCallback(HttpServletRequest request) {
        boolean isValid = payService.verifyPayCallback(request);

        if (isValid) {
            // 1. 解析回调参数
            String orderNumber = request.getParameter("out_trade_no"); // 商户订单号
            String tradeNo = request.getParameter("trade_no");         // 支付宝流水号
            String tradeStatus = request.getParameter("trade_status"); // 交易状态
            String totalAmount = request.getParameter("total_amount"); // 支付金额

            // 2. 记录日志
            log.info("【支付回调】订单号: {}, 支付宝流水号: {}, 状态: {}", orderNumber, tradeNo, tradeStatus);

            // 3. 根据业务处理
            if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
                // 更新订单状态和流水号
                payService.updateOrderStatus(orderNumber, tradeNo, "PAID");
                return "success"; // 告诉支付宝接收成功
            }
        }

        return "failure"; // 告诉支付宝接收失败
    }

    /**
     * 查询支付订单状态
     *
     * @param orderNumber 订单号
     * @return 订单详情
     */
    @GetMapping("/order/status")
    public AjaxResult getOrderStatus(@RequestParam String orderNumber) {
        PayOrder order = payService.getOrderStatus(orderNumber);
        return order != null ? AjaxResult.success(order) : AjaxResult.error("订单不存在");
    }

    /**
     * 统一支付接口
     */
    @PostMapping("/unified")
    public String unifiedPay(@RequestBody PayRequestDTO payRequestDTO) {
        return payService.unifiedPay(payRequestDTO);
    }

    /**
     * 统一订单查询接口
     */
    @PostMapping("/query")
    public PayOrderVO queryOrder(@RequestBody OrderQueryDTO queryDTO) throws AlipayApiException {
        return payService.queryOrder(queryDTO);
    }
}
